package cn.handong.tool.设计模式.代理模式.动态代理814;

import net.sf.cglib.proxy.InvocationHandler;
import net.sf.cglib.proxy.Proxy;

import java.lang.reflect.Method;

public class ProxyFactory implements InvocationHandler {
    private Object target;

    public Object getTarget() {
        return target;
    }
    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     *
     * @param proxy  代理对象，newProxyInstance方法的返回对象
     * @param method  具体的方法名
     * @param args   方法传的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result;
        if(proxy instanceof Pet){
             if("say".equals(method.getName())){
                 System.out.println(" say 前");
                 result = method.invoke(target, args);  //相当于执行具体的方法
                 System.out.println(" say 后");
                 return result;  // 返回执行结果
             }

        }
        return method.invoke(target, args);
    }
    public Object createProxy(){
        Class[] interfaces = target.getClass().getInterfaces();
        if(interfaces.length==0){
            System.out.println("该类无接口，不能使用jdk都动态代理");
            throw new RuntimeException("该类无接口，不能使用jdk都动态代理");
        }
        //newProxyInstance: 创建代理对象
        // 参数一: 被代理类对象
        // 参数二：接口类对象  被代理对象所实现的接口
        // 参数三：调用处理器。 被调用对象的那个方法被调用后该如何处理
        return Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), interfaces, this);
    }
}